{
/* Do an initial placement. Pick the least-populated CPU. */
struct domain *d;
- unsigned int i, cnt[NR_CPUS] = { 0 };
+ struct exec_domain *ed;
+ unsigned int i, ht, cnt[NR_CPUS] = { 0 };
read_lock(&domlist_lock);
- for_each_domain ( d )
- cnt[d->processor]++;
+ for_each_domain ( d ) {
+ for_each_exec_domain ( d, ed )
+ cnt[ed->processor]++;
+ }
read_unlock(&domlist_lock);
- for ( i = 0; i < smp_num_cpus; i++ )
- if ( cnt[i] < cnt[pro] )
- pro = i;
+ /* If we're on a HT system, we only use the first HT for dom0,
+ other domains will all share the second HT of each CPU.
+ Since dom0 is on CPU 0, we favour high numbered CPUs in
+ the event of a tie */
+ ht = opt_noht ? 1 : ht_per_core;
+ pro = ht-1;
+ for ( i = pro; i < smp_num_cpus; i += ht )
+ if ( cnt[i] <= cnt[pro] )
+ pro = i;
}
else
pro = op->u.createdomain.cpu % smp_num_cpus;